import cv2 as cv
from cv2 import dnn
import numpy as np
import matplotlib.pyplot as plt

img_cv2 = cv.imread('02.yuan.jpg')
print('原图大小: ', img_cv2.shape)

inHeight = 81
inWidth = 50
outBlob1 = dnn.blobFromImage(img_cv2,  # cv2.imread读取的图片数据
                             scalefactor=1.0 / 255,  # 缩放像素值, 如 [0, 255] - [0, 1]
                             size=(inWidth, inHeight),  # 输出blob的尺寸, 如(netInWidth, netInHeight)
                             mean=(0, 0, 0),  # 从各通道减均值, 如果输入image为BGR次序, 且swapRB=True, 则通道次序为(mean-R, mean-G, mean-B)
                             swapRB=False,  # 交换3通道图片的第一个和最后一个通道, 如: BGR-RGB
                             crop=False  # 图像尺寸resize后是否裁剪, 如果crop=True 则输入图片的尺寸调整resize后, 一边对应与size的一个维度,
                             # 而另一边的值大于等于size的另一个维度; 然后从resize后的图片中心进行crop. 如果crop=False 则无需crop, 只需要保持长宽比
                             # ddepth=None  # ddepth 输出blob的Depth 可选CV_32F 或 CV_8U
                             )
print('未裁剪输出: ', outBlob1.shape)
out_img1 = np.transpose(outBlob1[0], (1, 2, 0))

outBlob2 = dnn.blobFromImage(img_cv2,
                             scalefactor=1.0 / 255,
                             size=(inWidth, inHeight),
                             mean=(0, 0, 0),
                             swapRB=False,
                             crop=True)
print('裁剪输出: ', outBlob2.shape)
out_img2 = np.transpose(outBlob2[0], (1, 2, 0))

plt.figure(figsize=[10, 10])
plt.subplot(1, 3, 1)
plt.title('输入图像', fontsize=16)
plt.imshow(img_cv2[:, :, ::-1])
plt.axis('off')
plt.subplot(1, 3, 2)
plt.title('输出图像 - 未裁剪', fontsize=16)
plt.imshow(cv.cvtColor(out_img1, cv.COLOR_BGR2RGB))
plt.axis('off')
plt.subplot(1, 3, 3)
plt.title('输出图像 - 已裁剪', fontsize=16)
plt.imshow(out_img2[:, :, ::-1])
plt.axis('off')
plt.show()

'''
dnn.NMSBoxes 根据给定的检测boxes和对应的scores进行NMS(非极大值抑制)处理
NMSBoxes(bboxes,  # 待处理的边界框 bounding boxes
            scores,  # 对于待处理边界框的scores
            score_threshold,  # 用于过滤boxes的score阈值
            nms_threshold,  # NMS用到的阈值
            indices,  # NMS处理后所保留的边界框的索引值
            eta=None,  # 自适应阈值公式中的相关系数: nmsthresholdᵢ₊₁ = eta * nmsthresholdᵢ
            top_k=None  # 如果top_k>0, 则保留最多top_k个边界框索引值
            )

dnn.readNet 加载深度学习网络及其模型参数
readNet(model, config=None, framework=None)
+ model 训练的权重参数的模型二值文件, 支持格式: *.caffemodel(Caffe) *.pd(TensorFlow) *.t7 *.net(Torch) *.weights(Darknet) *.bin(DLDT)
+ config 包含网络配置的文本文件, 支持格式: *.prototxt(Caffe) *.pbtxt(TensorFlow) *.cfg(Darknet) *.xml(DLDT)
* framework 所支持格式的框架名
'''
